package com.yf.course.websocket.server;

import com.yf.ability.websocket.CustomSpringConfigurator;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Log4j2
@Component
@ServerEndpoint(value = "/api/socket/system/{userId}", configurator = CustomSpringConfigurator.class)
public class SystemEndpoint {

    /**
     * key: userId
     * value: session
     */
    private final static Map<String, Session> CLIENTS = new ConcurrentHashMap<>();

    /**
     * 当 WebSocket 建立连接成功后会触发这个注解修饰的方法
     * @param session 用户会话
     * @param userId 用户ID
     */
    @OnOpen
    public void onOpen(Session session, @PathParam(value = "userId") String userId) {
        CLIENTS.put(userId, session);
        System.out.println("用户 " + userId + " 的连接已经建立");
    }

    /**
     * 当 WebSocket 断开连接成功后会触发这个注解修饰的方法
     * @param userId 用户ID
     */
    @OnClose
    public void onClose(@PathParam(value = "userId") String userId) {
        CLIENTS.remove(userId);
        System.out.println("用户 " + userId + " 的连接已经断开");
    }

    /**
     * 当客户端发送消息到服务端时，会触发这个注解修改的方法
     * @param session 用户会话
     * @param message 发送的消息
     */
    @OnMessage
    public void onMessage(Session session, String message) throws IOException {
        System.out.println(message);
    }

    /**
     * 当 WebSocket 建立连接时出现异常会触发这个注解修饰的方法
     * @param userId 用户ID
     * @param throwable 连接错误的异常对象
     */
    @OnError
    public void onError(@PathParam(value = "userId") String userId, Throwable throwable) {
        System.out.println("用户 " + userId + " 的连接出错: " + throwable.getMessage());
    }

    /**
     * 通过用户ID获取用户会话
     * @param userId 用户ID
     */
    public Session getSession(String userId) {
        return CLIENTS.get(userId);
    }
}
